package package06章_面向对象编程_基础._02oop;

/**
 * ClassName: e_6_02类的实例化剖析_内存解析
 * Package: package06章_面向对象编程_基础.oop02
 * Description:
 *

 1. 对象在内存中的分配涉及到的内存结构（理论）
 - 栈(stack): 方法内定义的变量，存储在栈中。
 - 堆(heap) : new 出来的结构（比如：数组实体、对象的实体）。包括对象中的属性
 - 方法区(method area) : 存放类的模板。比如：Person类的模板


 2. 类中对象的内存解析
 2.1 创建类的一个对象
 见《01-创建类的一个对象.png》

 2.2 创建类的多个对象
 见《02-创建类的多个对象1.png》、《02-创建类的多个对象2.png》

 强调1：创建了Person类的两个对象
 Person p1 = new Person();
 Person p2 = new Person();

 说明：创建类的多个对象时，每个对象在堆空间中有一个对象实体。每个对象实体中保存着一份类的属性。
 如果修改某一个对象的某属性值时，不会影响其他对象此属性的值。
 p1.age = 10;
 p2.age = 20;

 p1.age = 30;
 System.out.println(p2.age);//20

 强调2：声明类的两个变量
 Person p1 = new Person();
 Person p3 = p1;

 说明：此时的p1，p3 两个变量指向了堆空间中的同一个对象实体。（或p1,p3保存的地址值相同）
 如果通过其中某一个对象变量修改对象的属性时，会影响另一个对象变量此属性的值。

 p1.age = 10;
 p3.age = 20;
 System.out.println(p1.age);//20


 2.3 对象调用方法的过程（在"03-类的成员之二：方法"中讲解）

 * @Author lys
 * @Create 2024/1/22 23:22
 * @Version 1.0
 */
public class e_6_02类的实例化剖析_内存解析 {
    public static void main(String[] args) {

        //创建对象、类的实例化
        Person p1 = new Person();

        //通过对象调用属性或方法
        p1.name = "杰克";
        p1.age = 24;
        p1.gender = '男';

        System.out.println("name = " + p1.name + ",age = " + p1.age +
                ", gender = " + p1.gender);

        p1.eat();
        p1.sleep(8);
        p1.interests("画画");

        //再创建Person类的一个实例
        Person p2 = new Person();
        p2.name = "露丝";
        p2.age = 18;
        p2.gender = '女';

        System.out.println("name = " + p2.name + ",age = " + p2.age +
                ", gender = " + p2.gender);

        System.out.println("name = " + p1.name + ",age = " + p1.age +
                ", gender = " + p1.gender);
    }
}
